package config

import (
	"gitee.com/gousing/values"
)

// GetMapAny 读取配置项并转换为 map[K]any , 如配置项不存在或转换失败, 则返回空的map
//   - TypeBase: string | bool |	int | int8 | int16 | int32 | int64 |	uint | uint8 | uint16 | uint32 | uint64 |	float32 | float64 |	time.Time | time.Duration| time.Month | time.Weekday
func GetMapAny[K values.TypeBase](key string) map[K]any {
	return GetMapAnyD(key, map[K]any{})
}

// GetMapAnyD 读取配置项并转换为 map[K]any , 如配置项不存在或转换失败, 则返回defaultVal指定的map
//   - TypeBase: string | bool |	int | int8 | int16 | int32 | int64 |	uint | uint8 | uint16 | uint32 | uint64 |	float32 | float64 |	time.Time | time.Duration| time.Month | time.Weekday
func GetMapAnyD[K values.TypeBase](key string, defaultVal map[K]any) map[K]any {
	if v, ok := GetExist(key); !ok {
		return defaultVal
	} else {
		if to, err := values.ToMapAnyE[K](v); err != nil {
			return defaultVal
		} else {
			return to
		}
	}
}

// GetMapAnyE 读取配置项并转换为 map[K]any, 如配置项不存在或转换失败, 则返回空的map和错误信息
//   - TypeBase: string | bool |	int | int8 | int16 | int32 | int64 |	uint | uint8 | uint16 | uint32 | uint64 |	float32 | float64 |	time.Time | time.Duration| time.Month | time.Weekday
func GetMapAnyE[K values.TypeBase](key string) (map[K]any, error) {
	if v, ok := GetExist(key); !ok {
		return map[K]any{}, ErrKeyNotExist
	} else {
		return values.ToMapAnyE[K](v)
	}
}

// GetMapAs 读取配置项并转换为 map[K]V , 如配置项不存在或转换失败, 则返回空的map
//   - K: map key 的类型 TypeBase
//   - V: map val 的类型 TypeBase
//   - TypeBase: string | bool |	int | int8 | int16 | int32 | int64 |	uint | uint8 | uint16 | uint32 | uint64 |	float32 | float64 |	time.Time | time.Duration| time.Month | time.Weekday
func GetMapAs[K, V values.TypeBase](key string) map[K]V {
	return GetMapAsD(key, map[K]V{})
}

// GetMapAsD 读取配置项并转换为 map[K]V , 如配置项不存在或转换失败, 则返回defaultVal指定的map
//   - K: map key 的类型 TypeBase
//   - V: map val 的类型 TypeBase
//   - TypeBase: string | bool |	int | int8 | int16 | int32 | int64 |	uint | uint8 | uint16 | uint32 | uint64 |	float32 | float64 |	time.Time | time.Duration| time.Month | time.Weekday
func GetMapAsD[K, V values.TypeBase](key string, defaultVal map[K]V) map[K]V {
	if v, ok := GetExist(key); !ok {
		return defaultVal
	} else {
		if to, err := values.ToMapAsE[K, V](v); err != nil {
			return defaultVal
		} else {
			return to
		}
	}
}

// GetMapAsE 读取配置项并转换为 map[K]V, 如配置项不存在或转换失败, 则返回空的map和错误信息
//   - K: map key 的类型 TypeBase
//   - V: map val 的类型 TypeBase
//   - TypeBase: string | bool |	int | int8 | int16 | int32 | int64 |	uint | uint8 | uint16 | uint32 | uint64 |	float32 | float64 |	time.Time | time.Duration| time.Month | time.Weekday
func GetMapAsE[K, V values.TypeBase](key string) (map[K]V, error) {
	if v, ok := GetExist(key); !ok {
		return map[K]V{}, ErrKeyNotExist
	} else {
		return values.ToMapAsE[K, V](v)
	}
}

// GetMapSlice 读取配置项并转换为 map[K][]V , 如配置项不存在或转换失败, 则返回空的map
//   - K: map key 的类型 TypeBase
//   - V: map val 的类型 []TypeBase
//   - TypeBase: string | bool |	int | int8 | int16 | int32 | int64 |	uint | uint8 | uint16 | uint32 | uint64 |	float32 | float64 |	time.Time | time.Duration| time.Month | time.Weekday
func GetMapSlice[K, V values.TypeBase](key string) map[K][]V {
	return GetMapSliceD(key, map[K][]V{})
}

// GetMapSliceD 读取配置项并转换为 map[K][]V , 如配置项不存在或转换失败, 则返回defaultVal指定的map
//   - K: map key 的类型 TypeBase
//   - V: map val 的类型 []TypeBase
//   - TypeBase: string | bool |	int | int8 | int16 | int32 | int64 |	uint | uint8 | uint16 | uint32 | uint64 |	float32 | float64 |	time.Time | time.Duration| time.Month | time.Weekday
func GetMapSliceD[K, V values.TypeBase](key string, defaultVal map[K][]V) map[K][]V {
	if v, ok := GetExist(key); !ok {
		return defaultVal
	} else {
		if to, err := values.ToMapSliceE[K, V](v); err != nil {
			return defaultVal
		} else {
			return to
		}
	}
}

// GetMapSliceE 读取配置项并转换为 map[K][]V, 如配置项不存在或转换失败, 则返回空的 map[K][]V 和错误信息
//   - K: map key 的类型 TypeBase
//   - V: map val 的类型 []TypeBase
//   - TypeBase: string | bool |	int | int8 | int16 | int32 | int64 |	uint | uint8 | uint16 | uint32 | uint64 |	float32 | float64 |	time.Time | time.Duration| time.Month | time.Weekday
func GetMapSliceE[K, V values.TypeBase](key string) (map[K][]V, error) {
	if v, ok := GetExist(key); !ok {
		return map[K][]V{}, ErrKeyNotExist
	} else {
		return values.ToMapSliceE[K, V](v)
	}
}
